/********************************************************************* * * Copyright (C) 2007 Andrew Khan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************/ package jxl.biff; import jxl.common.Logger; import jxl.read.biff.Record; /** * Range information for conditional formatting */ public class ConditionalFormatRangeRecord extends WritableRecordData { // The logger private static Logger logger = Logger.getLogger(ConditionalFormatRangeRecord.class); /** * The enclosing range */ private Range enclosingRange; /** * The discrete ranges */ private Range[] ranges; /** * The number of ranges */ private int numRanges; /** * Initialized flag */ private boolean initialized; /** * Modified flag */ private boolean modified; /** * The data */ private byte[] data; private static class Range { public int firstRow; public int firstColumn; public int lastRow; public int lastColumn; public boolean modified; public Range() { modified = false; } /** * Inserts a blank column into this spreadsheet. If the column is out of * range of the columns in the sheet, then no action is taken * * @param col the column to insert */ public void insertColumn(int col) { if (col > lastColumn) { return; } if (col <= firstColumn) { firstColumn++; modified = true; } if (col <= lastColumn) { lastColumn++; modified = true; } } /** * Removes a column from this spreadsheet. If the column is out of range * of the columns in the sheet, then no action is taken * * @param col the column to remove */ public void removeColumn(int col) { if (col > lastColumn) { return; } if (col < firstColumn) { firstColumn--; modified = true; } if (col <= lastColumn) { lastColumn--; modified = true; } } /** * Removes a row from this spreadsheet. If the row is out of * range of the columns in the sheet, then no action is taken * * @param row the row to remove */ public void removeRow(int row) { if (row > lastRow) { return; } if (row < firstRow) { firstRow--; modified = true; } if (row <= lastRow) { lastRow--; modified = true; } } /** * Inserts a blank row into this spreadsheet. If the row is out of range * of the rows in the sheet, then no action is taken * * @param row the row to insert */ public void insertRow(int row) { if (row > lastRow) { return; } if (row <= firstRow) { firstRow++; modified = true; } if (row <= lastRow) { lastRow++; modified = true; } } } /** * Constructor */ public ConditionalFormatRangeRecord(Record t) { super(t); initialized = false; modified = false; data = getRecord().getData(); } /** * Initialization function */ private void initialize() { enclosingRange = new Range(); enclosingRange.firstRow = IntegerHelper.getInt(data[4], data[5]); enclosingRange.lastRow = IntegerHelper.getInt(data[6], data[7]); enclosingRange.firstColumn = IntegerHelper.getInt(data[8], data[9]); enclosingRange.lastColumn = IntegerHelper.getInt(data[10], data[11]); numRanges = IntegerHelper.getInt(data[12], data[13]); ranges = new Range[numRanges]; int pos = 14; for (int i = 0; i < numRanges; i++) { ranges[i] = new Range(); ranges[i].firstRow = IntegerHelper.getInt(data[pos], data[pos+1]); ranges[i].lastRow = IntegerHelper.getInt(data[pos+2], data[pos+3]); ranges[i].firstColumn = IntegerHelper.getInt(data[pos+4], data[pos+5]); ranges[i].lastColumn = IntegerHelper.getInt(data[pos+6], data[pos+7]); pos += 8; } initialized = true; } /** * Inserts a blank column into this spreadsheet. If the column is out of * range of the columns in the sheet, then no action is taken * * @param col the column to insert */ public void insertColumn(int col) { if (!initialized) { initialize(); } enclosingRange.insertColumn(col); if (enclosingRange.modified) { modified = true; } for (int i = 0 ; i < ranges.length ; i++) { ranges[i].insertColumn(col); if (ranges[i].modified) { modified = true; } } return; } /** * Inserts a blank column into this spreadsheet. If the column is out of * range of the columns in the sheet, then no action is taken * * @param col the column to insert */ public void removeColumn(int col) { if (!initialized) { initialize(); } enclosingRange.removeColumn(col); if (enclosingRange.modified) { modified = true; } for (int i = 0 ; i < ranges.length ; i++) { ranges[i].removeColumn(col); if (ranges[i].modified) { modified = true; } } return; } /** * Removes a row from this spreadsheet. If the row is out of * range of the columns in the sheet, then no action is taken * * @param row the row to remove */ public void removeRow(int row) { if (!initialized) { initialize(); } enclosingRange.removeRow(row); if (enclosingRange.modified) { modified = true; } for (int i = 0 ; i < ranges.length ; i++) { ranges[i].removeRow(row); if (ranges[i].modified) { modified = true; } } return; } /** * Inserts a blank row into this spreadsheet. If the row is out of range * of the rows in the sheet, then no action is taken * * @param row the row to insert */ public void insertRow(int row) { if (!initialized) { initialize(); } enclosingRange.insertRow(row); if (enclosingRange.modified) { modified = true; } for (int i = 0 ; i < ranges.length ; i++) { ranges[i].insertRow(row); if (ranges[i].modified) { modified = true; } } return; } /** * Retrieves the data for output to binary file * * @return the data to be written */ public byte[] getData() { if (!modified) { return data; } byte[] d = new byte[14 + ranges.length * 8]; // Copy in the original information System.arraycopy(data, 0, d, 0, 4); // Create the new range IntegerHelper.getTwoBytes(enclosingRange.firstRow, d, 4); IntegerHelper.getTwoBytes(enclosingRange.lastRow, d, 6); IntegerHelper.getTwoBytes(enclosingRange.firstColumn, d, 8); IntegerHelper.getTwoBytes(enclosingRange.lastColumn, d, 10); IntegerHelper.getTwoBytes(numRanges, d, 12); int pos = 14; for (int i = 0 ; i < ranges.length ; i++) { IntegerHelper.getTwoBytes(ranges[i].firstRow, d, pos); IntegerHelper.getTwoBytes(ranges[i].lastRow, d, pos+2); IntegerHelper.getTwoBytes(ranges[i].firstColumn, d, pos+4); IntegerHelper.getTwoBytes(ranges[i].lastColumn, d, pos+6); pos += 8; } return d; } }